<?php

namespace action\user;

use \cass\formulaire AS form,
    \cass\Cache;

class connexionAction extends \cass\Action {

    /**
     * Méthode de cache
     * @return Integer Type de cache (Cache::<type>)
     */
    public function cache() {
        return array(
            'execute' => Cache::NO,
            'executeTop' => Cache::SESSION_MULTIPLE
        );
    }

    /**
     * Méthode de connexion 
     */
    public function execute() {
        // Redirection si déjà connecté
        $this->forwardIf($this->getSession()->isAuthenticated(), '@homepage');

        // Infos de la page
        $this->setTitle('Connexion');

        // Formulaire de connexion
        $formulaire = new form\Formulaire('Formulaire de connexion');
        $formulaire->setButtons('submit', 'Se connecter');
        $formulaire->addToLinks('Difficultés pour se connecter ?', url_for('user', 'motdepasse'));
        $formulaire->addToLinks('<strong>Rejoindre la communauté</strong>', url_for('user', 'inscription'));
        $formulaire->append(new form\Input('Identifiant', '', true, 'Votre identifiant ou votre adresse e-mail'));
        $formulaire->append(new form\Password('Mot de passe'));
        $formulaire->append(new form\Checkbox('Se souvenir de moi', '', false, 'Connexion future automatique'));
        $formulaire->append(new form\Hidden('referer', $_SERVER['REQUEST_URI']));

        // Vérifications
        if ($formulaire->isPosted()) {

            // Vérifie la connexion
            if (!$formulaire->{'Identifiant'}->isError() AND !$formulaire->{'Mot de passe'}->isError()) {
                $user = $this->doctrine->getRepository('User')->findOneByName($formulaire->getValue('Identifiant'));
                if (empty($user) AND preg_match(\cass\Data::regex('email'), $formulaire->getValue('Identifiant'))) {
                    $user = $this->doctrine->getRepository('User')->findOneByEmail($formulaire->getValue('Identifiant'));
                }

                if (empty($user)) {
                    $formulaire->{'Identifiant'}->setError('Identifiant non reconnu');
                } else {
                    if (encrypt($formulaire->getValue('Mot de passe'), $user->getSalt()) != $user->getPassword()) {
                        $formulaire->{'Mot de passe'}->setError('Mot de passe incorrect');
                    }
                }
            }
        }

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) { 
            $this->getSession()->connect($user, $formulaire->getValue('Se souvenir de moi'));
            $this->redirectUrl(($formulaire->getValue('referer') != '/' . url_for('user', 'connexion')) ? $formulaire->getValue('referer') : url_for('@homepage'));
        }

        // Assignations
        $this->formulaire = $formulaire;
    }

    /**
     * Méthode du formulaire du haut de page
     */
    public function executeTop() {
        $formulaire = new form\Formulaire('Formulaire rapide de connexion');
        $formulaire->setTemplate('_formList');
        $formulaire->setButtons('submit', 'Se connecter');
        $formulaire->setAction(url_for('user', 'connexion'));

        $identifiant = new form\Input('Identifiant', 'Identifiant');
        $identifiant->addToOptions('class', 'connexion-identifiant');
        $password = new form\Password('Mot de passe', 'Motdepasse');
        $password->addToOptions('class', 'connexion-password');

        $formulaire->append($identifiant);
        $formulaire->append($password);
        $formulaire->append(new form\Hidden('referer', $_SERVER['REQUEST_URI']));
        $formulaire->append(new form\Checkbox('Se souvenir de moi', '', false, 'Se souvenir de moi ?'));
        $formulaire->append(new form\Hidden('formulaire-de-connexion-submit', 'Se connecter'));

        // Assignations
        $this->formulaire = $formulaire;
    }

}